package nl.moviefan.site.controller;

import java.security.Principal;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import nl.moviefan.site.model.Artikel;
import nl.moviefan.site.model.Beoordeling;
import nl.moviefan.site.model.MoviefanUser;
import nl.moviefan.site.model.Recensie;
import nl.moviefan.site.service.ArtikelService;
import nl.moviefan.site.service.BeoordelingService;
import nl.moviefan.site.service.CustomerService;
import nl.moviefan.site.service.RecensieService;
import nl.moviefan.site.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * Handlder for mapping all /artikel uri
 */
@Controller
@RequestMapping("/artikel")
public class ArtikelController {

    private static final Logger LOGGER = LoggerFactory.getLogger(ArtikelController.class);

    @Autowired
    ArtikelService artikelservice;

    @Autowired
    BeoordelingService beoordelingservice;

    @Autowired
    RecensieService recensieservice;

    @Autowired
    UserService userservice;

    @Autowired
    CustomerService customerservice;

    /**
     * Laadt alle artikelen
     *
     * @return
     */
    @RequestMapping(value = {"/index", "", "/"}, method = RequestMethod.GET)
    public ModelAndView getAllArtikelen() {
        List<Artikel> artikelen = artikelservice.getAll();
        ModelAndView model = new ModelAndView("artikel/index");
        model.addObject("artikelen", artikelen);
        return model;
    }

    /**
     * Laadt alle artikelen met bijbehorende recensies en beoordelingen.
     *
     * @param id
     * @param principal
     * @return
     */
    @RequestMapping(value = "/details/{id}", method = RequestMethod.GET)
    public ModelAndView getArtikelDetails(@PathVariable long id, Principal principal) {
        Artikel artikel = null;
        List<Beoordeling> beoordelingen = null;
        List<Recensie> recensies = null;
        double total = 0;
        double average = 0;
        int aantalRecensies = 0;
        int aantalBeoordelingen = 0;
        try {
            artikel = artikelservice.findByArtikelID(id);
            beoordelingen = beoordelingservice.getByArtikel(artikel);
            recensies = recensieservice.getByArtikel(artikel);

            for (Beoordeling beoordeling : beoordelingen) {
                total = total + beoordeling.getCijfer();

                LOGGER.debug("CIJFER: " + beoordeling.getCijfer());
            }
            average = total / beoordelingen.size();
            aantalRecensies = recensies.size();
            aantalBeoordelingen = beoordelingen.size();
        } catch (Exception ex) {
            ex.getMessage();
        }
        ModelAndView mav = new ModelAndView("artikel/details");

        if (principal != null) {
            MoviefanUser mu = userservice.findByUsername(principal.getName());
            boolean resultBeoordeling = beoordelingservice.checkIfUnique(mu, artikel);
            boolean resultRecensie = recensieservice.checkIfUnique(mu, artikel);
            mav.addObject("beoordeeldornot", resultBeoordeling);
            mav.addObject("gerecenseerdornot", resultRecensie);
        }

        mav.addObject("recensies", recensies);
        mav.addObject("beoordelingen", beoordelingen);
        mav.addObject("aantalBeoordelingen", aantalBeoordelingen);
        mav.addObject("average", average);
        mav.addObject("recensies", recensies);
        mav.addObject("aantalRecensies", aantalRecensies);
        mav.addObject("artikel", artikel);
        return mav;
    }

}
